package com.huangsm.juc.volatile1;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 一、i++的原子性:i++的操作实际上分为三个步骤"读-改-写"
 *      int i=10;
 *      i=i++;//10
 *      int temp=i;
 *      i=i+1;
 *      i=temp;
 *
 * 二、原子变量:jdk1.6后java.util.concurrent.atomic包下提供了常用的原子变量
 *              1.volatile保证内存可见性
 *              2.CAS算法保证数据的原子性
 */
public class TestAtomicDemo {
    public static void main(String[] args) {
        AtomicDemo atomicDemo=new AtomicDemo();
        for (int i = 0; i < 10; i++) {
            new Thread(atomicDemo).start();
        }
    }
}

class AtomicDemo implements Runnable{
    //存在原子性问题，和内存可见性问题
    //private int number=0;
    private AtomicInteger integer=new AtomicInteger(0);
    public int getNumber() {
        return integer.getAndIncrement();
    }

    @Override
    public void run() {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+":"+getNumber());
    }
}
